package com.hfb.mashibing.alip8.jvm.asm;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;

/**
 * asm动态生成动态代理字节码文件—— .class 文件
 */
public class ClassTransformerTest {
    public static void main(String[] args) throws IOException {
        String pkg = "com/hfb/mashibing/alip8/jvm/asm";
        ClassReader cr = new ClassReader(
            ClassPrinter.class.getClassLoader().getResourceAsStream(
                pkg
            ));

        ClassWriter cw = new ClassWriter(0);
//        ClassVisitor cv = new ClassVisitor(ASM4, cw) {
//            @Override
//            public void visit(int i, int i1, String s, String s1, String s2, String[] strings) {
//
//            }
//
//            @Override
//            public void visitSource(String s, String s1) {
//
//            }
//
//            @Override
//            public void visitOuterClass(String s, String s1, String s2) {
//
//            }
//
//            @Override
//            public AnnotationVisitor visitAnnotation(String s, boolean b) {
//                return null;
//            }
//
//            @Override
//            public void visitAttribute(Attribute attribute) {
//
//            }
//
//            @Override
//            public void visitInnerClass(String s, String s1, String s2, int i) {
//
//            }
//
//            @Override
//            public FieldVisitor visitField(int i, String s, String s1, String s2, Object o) {
//                return null;
//            }
//
//            @Override
//            public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
//                System.out.println("descriptor: "+descriptor);
//
//                return new MethodVisitor() {
//                    @Override
//                    public AnnotationVisitor visitAnnotationDefault() {
//                        return null;
//                    }
//
//                    @Override
//                    public AnnotationVisitor visitAnnotation(String s, boolean b) {
//                        return null;
//                    }
//
//                    @Override
//                    public AnnotationVisitor visitParameterAnnotation(int i, String s, boolean b) {
//                        return null;
//                    }
//
//                    @Override
//                    public void visitAttribute(Attribute attribute) {
//
//                    }
//
//                    @Override
//                    public void visitCode() {
////                        visitMethodInsn(INVOKEDYNAMIC,"TimeProxy", "before","()V",false);
//                        visitMethodInsn(INVOKEDYNAMIC,"TimeProxy", "before","()V");
//                    }
//
//                    @Override
//                    public void visitFrame(int i, int i1, Object[] objects, int i2,
//                        Object[] objects1) {
//
//                    }
//
//                    @Override
//                    public void visitInsn(int i) {
//
//                    }
//
//                    @Override
//                    public void visitIntInsn(int i, int i1) {
//
//                    }
//
//                    @Override
//                    public void visitVarInsn(int i, int i1) {
//
//                    }
//
//                    @Override
//                    public void visitTypeInsn(int i, String s) {
//
//                    }
//
//                    @Override
//                    public void visitFieldInsn(int i, String s, String s1, String s2) {
//
//                    }
//
//                    @Override
//                    public void visitMethodInsn(int i, String s, String s1, String s2) {
//
//                    }
//
//                    @Override
//                    public void visitJumpInsn(int i, Label label) {
//
//                    }
//
//                    @Override
//                    public void visitLabel(Label label) {
//
//                    }
//
//                    @Override
//                    public void visitLdcInsn(Object o) {
//
//                    }
//
//                    @Override
//                    public void visitIincInsn(int i, int i1) {
//
//                    }
//
//                    @Override
//                    public void visitTableSwitchInsn(int i, int i1, Label label, Label[] labels) {
//
//                    }
//
//                    @Override
//                    public void visitLookupSwitchInsn(Label label, int[] ints, Label[] labels) {
//
//                    }
//
//                    @Override
//                    public void visitMultiANewArrayInsn(String s, int i) {
//
//                    }
//
//                    @Override
//                    public void visitTryCatchBlock(Label label, Label label1, Label label2,
//                        String s) {
//
//                    }
//
//                    @Override
//                    public void visitLocalVariable(String s, String s1, String s2, Label label,
//                        Label label1, int i) {
//
//                    }
//
//                    @Override
//                    public void visitLineNumber(int i, Label label) {
//
//                    }
//
//                    @Override
//                    public void visitMaxs(int i, int i1) {
//
//                    }
//
//                    @Override
//                    public void visitEnd() {
//
//                    }
//                };
//            }
//
//            @Override
//            public void visitEnd() {
//
//            }
//        };
//        cr.accept(cv, 0);

        cr.accept(cw, 0);
        byte[] bs = cw.toByteArray();

        String path = (String) System.getProperties().get("user.dir");
        File f = new File(path + pkg);
        f.mkdirs();
        FileOutputStream out = new FileOutputStream(new File(path+pkg+"Tank_0.class"));
        out.write(bs);
        out.flush();
        out.close();
    }
    static class MyClassLoader extends ClassLoader {
        public Class defineClass(String name,byte[] bs) {
            return defineClass(name,bs,0,bs.length);
        }
    }
}

